import xlsx from 'xlsx'
import xlsxStyle from 'xlsx-style'
import fileSaver from 'file-saver'

export function exportExcel(fileName, excelData) {
  // 单元格样式
  const styleBase = {
    font: {
      sz: 13,
      color: {
        rgb: '00104E8B'
      }
    },
    border: {
      top: { style: 'thin' },
      bottom: { style: 'thin' },
      left: { style: 'thin' },
      right: { style: 'thin' }
    }
  }
  const styleCenter = Object.assign({}, styleBase, {
    alignment: {
      vertical: 'center',
      horizontal: 'center'
    }
  })
  const styleLeft = Object.assign({}, styleBase, {
    alignment: {
      vertical: 'center',
      horizontal: 'left'
    }
  })
  const styleBold = Object.assign({}, styleCenter, {
    font: {
      sz: 15,
      bold: true,
      color: {
        rgb: 'FFFFFF'
      }
    },
    fill: {
      fgColor: { rgb: '808080' }
    }
  })

  // 通过工具将json转表对象
  const worksheet = xlsx.utils.json_to_sheet(excelData)
  // 给表头设置样式
  const keys = Object.keys(worksheet)
  for (const key of keys) {
    if (key !== '!ref' && key.includes('1') && key.length < 3) {
      worksheet[key].s = styleBold
    }
  }

  // 给数据设置样式
  for (const key of keys) {
    if (key !== '!ref' && !(key.includes('1') && key.length < 3)) {
      worksheet[key].s = styleCenter
    }
  }

  // 构建 workbook 对象
  const wb = {
    SheetNames: ['sheet1'],
    Sheets: {
      // Sheet1 表示工作簿名称
      'sheet1': Object.assign({}, worksheet, {
        // 设置 excel 单元格列的宽度
        '!cols': [
          { wch: 20 }, // 第一列
          { wch: 60 }, // 第二列
          { wch: 15 }, // 第三列
          { wch: 30 }, // 第四列
          { wch: 15 }, // 第五列
          { wch: 15 }, // 第六列
          { wch: 15 }, // 第七列
          { wch: 15 }, // 第八列
          { wch: 15 }, // 第九列
          { wch: 15 } // 第十列
        ]
        // excel 表格渲染范围
        // '!ref': ref,
        // 合并 excel 单元格
        // '!merges': [{
        //     s: { // s开始
        //         c: 0, // 开始列
        //         r: 1  // 开始取值范围
        //     },
        //     e: { // e结束
        //         c: 0, // 结束列
        //         r: 3   // 结束范围
        //     }
        // }]
      })
    }
  }
  const tmpDown = new Blob([
    s2ab(
      // 这里的数据是用来定义导出的格式类型
      xlsxStyle.write(wb, {
        bookType: 'xlsx',
        bookSST: false,
        type: 'binary'
      })
    )
  ], {
    type: ''
  })
  fileSaver.saveAs(tmpDown, filename)
}

function s2ab(s) {
  if (typeof ArrayBuffer !== 'undefined') {
    const buf = new ArrayBuffer(s.length)
    const view = new Uint8Array(buf)
    for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF
    return buf
  } else {
    const buf = new Array(s.length)
    for (let i = 0; i !== s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF
    return buf
  }
}
